package controllers

import (
	"errors"
	"github.com/gin-gonic/gin"
	"go-kube-mgr/config"
	"go-kube-mgr/utils/kubeutils/kubeutils"
	"go-kube-mgr/utils/logs"
	"net/http"
)

type BasicInfo struct {
	ClusterId  string      `json:"clusterId" form:"clusterId"`
	Namespace  string      `json:"namespace" form:"namespace"`
	Name       string      `json:"name" form:"name"`
	Item       interface{} `json:"item"`
	DeleteList []string    `json:"deleteList"`
}

type Info struct {
	BasicInfo
	ReturnData    config.ReturnData
	LabelSelector string `json:"labelSelector" form:"labelSelector"`
	FieldSelector string `json:"fieldSelector" form:"fieldSelector"`
	Force         bool   `json:"force" form:"force"`
}

// 绑定从前端传回的info值；读取kubeconfig
func NewInfo(r *gin.Context, info *Info, returDataMsg string) (kubeconfig string) {
	requestMethod := r.Request.Method
	var err error
	info.ReturnData.Message = returDataMsg
	info.ReturnData.Status = 200
	switch requestMethod {
	case "GET":
		err = r.ShouldBindQuery(&info)
	case "POST":
		err = r.ShouldBindJSON(&info)
	default:
		err = errors.New("不支持的请求类型")
	}
	if err != nil {
		msg := "请求出错：" + err.Error()
		info.ReturnData.Message = msg
		info.ReturnData.Status = 400
		logs.Error(nil, msg)
		r.JSON(http.StatusOK, info.ReturnData)
		return
	}

	kubeconfig = config.ClusterKubeconfig[info.ClusterId]
	return
}

func (c *Info) Create(r *gin.Context, kubeUtilsInterface kubeutils.KubeUtilser) {
	err := kubeUtilsInterface.Create(c.Namespace)
	if err != nil {
		msg := "资源创建失败：" + err.Error()
		c.ReturnData.Message = msg
		c.ReturnData.Status = 400
		logs.Error(nil, msg)
	}
	r.JSON(200, c.ReturnData)
}

func (c *Info) Update(r *gin.Context, kubeUtilsInterface kubeutils.KubeUtilser) {
	err := kubeUtilsInterface.Update(c.Namespace)
	if err != nil {
		msg := "资源更新失败：" + err.Error()
		c.ReturnData.Message = msg
		c.ReturnData.Status = 400
		logs.Error(nil, msg)
	}
	r.JSON(200, c.ReturnData)
}

func (c *Info) Get(r *gin.Context, kubeUtilsInterface kubeutils.KubeUtilser) {
	item, err := kubeUtilsInterface.Get(c.Namespace, c.Name)
	if err != nil {
		msg := "查询失败：" + err.Error()
		c.ReturnData.Message = msg
		c.ReturnData.Status = 400
		logs.Error(nil, msg)
	} else {
		c.ReturnData.Data = make(map[string]interface{})
		c.ReturnData.Data["item"] = item
	}
	r.JSON(200, c.ReturnData)
}

func (c *Info) List(r *gin.Context, kubeUtilsInterface kubeutils.KubeUtilser) {
	itemlist, err := kubeUtilsInterface.List(c.Namespace, c.LabelSelector, c.FieldSelector)
	if err != nil {
		msg := "查询列表失败：" + err.Error()
		c.ReturnData.Message = msg
		c.ReturnData.Status = 400
		logs.Error(nil, msg)
	} else {
		c.ReturnData.Data = make(map[string]interface{})
		c.ReturnData.Data["item"] = itemlist
	}
	r.JSON(200, c.ReturnData)
}

func (c *Info) Delete(r *gin.Context, kubeUtilsInterface kubeutils.KubeUtilser) {
	var gracePeriodSecods int64
	if c.Force {
		// 表示强制删除
		gracePeriodSecods = 0
	}
	err := kubeUtilsInterface.Delete(c.Namespace, c.Name, &gracePeriodSecods)
	if err != nil {
		msg := "删除资源失败：" + err.Error()
		c.ReturnData.Message = msg
		c.ReturnData.Status = 400
		logs.Error(nil, msg)
	}
	r.JSON(200, c.ReturnData)
}

func (c *Info) Deletelist(r *gin.Context, kubeUtilsInterface kubeutils.KubeUtilser) {
	var gracePeriodSecods int64
	if c.Force {
		gracePeriodSecods = 0
	}
	err := kubeUtilsInterface.DeleteList(c.Namespace, c.BasicInfo.DeleteList, &gracePeriodSecods)
	if err != nil {
		msg := "资源删除失败：" + err.Error()
		c.ReturnData.Message = msg
		c.ReturnData.Status = 400
		logs.Error(nil, msg)
	}
	r.JSON(200, c.ReturnData)
}
